package com.itcam.methodreferences;

/**
 * @author : Cammy.Wu
 * Description : 类名::非静态方法名
 */

public class Demo02 {
    /**
     * 程序的入口点，调用高阶函数并传入方法引用
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 调用 highOrder 方法，并传入 Student 类的 hello 方法的方法引用
        highOrder(Student::hello);
    }

    /**
     * 高阶函数，接收一个实现了 Demo 接口的 lambda 表达式或方法引用
     * @param lambda 实现了 Demo 接口的 lambda 表达式或方法引用
     */
    static void highOrder(Demo lambda) {
        // 创建一个 Student 对象，名字为 "上官云雀"
        // 调用 lambda 表达式的 transfer 方法，传入 Student 对象和消息 "Hello"
        // 打印 transfer 方法的返回结果
        System.out.println(lambda.transfer(new Student("上官云雀"), "Hello"));
    }

    /**
     * 定义一个函数式接口，包含一个抽象方法 transfer
     */
    interface Demo {
        /**
         * 抽象方法，用于将消息传递给学生对象并返回处理后的字符串
         * @param stu 学生对象
         * @param message 要传递的消息
         * @return 处理后的字符串
         */
        String transfer(Student stu, String message);
    }

    /**
     * 静态内部类，表示学生对象
     */
    static class Student {
        // 学生的名字
        String name;

        /**
         * 构造函数，用于初始化学生的名字
         * @param name 学生的名字
         */
        public Student(String name) {
            this.name = name;
        }

        /**
         * 实例方法，用于让学生说出传入的消息
         * @param message 要说出的消息
         * @return 包含学生名字和消息的字符串
         */
        public String hello(String message) {
            // 返回格式化后的字符串，包含学生名字和消息
            return this.name + " say: " + message;
        }
    }

}
